package org.dromara.common.core.utils;

import jakarta.validation.ConstraintViolation;
import jakarta.validation.ConstraintViolationException;
import jakarta.validation.Validator;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;

import java.util.Set;


/**
 * @Author 刘武贵
 * @Date 2024/8/15 22:00
 * @Description 功能描述：Validator 校验框架工具
 */
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class ValidatorUtils {

    /**
     * 使用Spring实用工具获取Validator类的单例，用于校验数据对象是否符合预定义的规则。
     */
    private static final Validator VALID = SpringUtils.getBean(Validator.class);

    /**
     * 对给定对象进行参数校验，并根据指定的校验组进行校验
     * 验证给定对象是否符合指定的校验组
     * 该方法使用泛型来确保灵活性和准确性，允许对不同类型的对象进行校验
     *
     * @param object 要进行校验的对象
     * @param groups 校验组，一个或多个校验组，指定要执行的校验规则
     * @throws ConstraintViolationException 如果校验不通过，则抛出参数校验异常
     */
    public static <T> void validate(T object, Class<?>... groups) {
        // 执行对象校验，返回校验不通过的结果集合
        Set<ConstraintViolation<T>> validate = VALID.validate(object, groups);
        // 如果校验结果不为空，则说明对象不符合校验规则，抛出异常
        if (!validate.isEmpty()) {
            throw new ConstraintViolationException("参数校验异常", validate);
        }
    }

}
